/**
 * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package coba.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Calendar;
import java.util.GregorianCalendar;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
import com.liferay.portal.kernel.dao.orm.OrderFactoryUtil;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.SystemException;

import coba.model.Contacto;
import coba.model.Guia;
import coba.model.Solicitud;
import coba.service.NumeracionSolicitudLocalServiceUtil;
import coba.service.base.SolicitudLocalServiceBaseImpl;

/**
 * The implementation of the Solicitud local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link coba.service.SolicitudLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security checks based on the propagated JAAS credentials because this service can only be accessed from within the same VM.
 * </p>
 *
 * @author rodri042
 * @see coba.service.base.SolicitudLocalServiceBaseImpl
 * @see coba.service.SolicitudLocalServiceUtil
 */
public class SolicitudLocalServiceImpl extends SolicitudLocalServiceBaseImpl {

	public Solicitud add(long contactoId, long cantidadParticipantes, long cantidadCoordinadores,
			long cantidadMicros, long discapacidad, long cantidadPersonasDiscapacidad,
			String microGratis, String observaciones, long itinerarioId, Date fechaItinerario,
			List<Long> listGuiaId, long usuarioAlta) throws SystemException, PortalException {

		Date hoy = new Date();
		
		Solicitud solicitud = solicitudPersistence.
				create(counterLocalService.increment(Solicitud.class.getName()));

		solicitud.setContactoId(contactoId);
		solicitud.setCantidadParticipantes(cantidadParticipantes);
		solicitud.setCantidadCoordinadores(cantidadCoordinadores);
		solicitud.setCantidadMicros(cantidadMicros);
		solicitud.setDiscapacidad(discapacidad);
		solicitud.setCantidadPersonasDiscapacidad(cantidadPersonasDiscapacidad);
		solicitud.setMicroGratis(microGratis);
		solicitud.setObservaciones(observaciones);
		solicitud.setItinerarioId(itinerarioId);
		solicitud.setFechaItinerario(fechaItinerario);
		solicitud.setFechaAsignacionItinerario(hoy);

		solicitud.setFechaAlta(hoy);
		solicitud.setUsuarioId(usuarioAlta);

		solicitud.setNumero(numeracionSolicitudLocalService.proximoNumero());

		solicitud = super.addSolicitud(solicitud);
		
		formularioGrupoLocalService.add(solicitud.getId());

		for (Long guiaId : listGuiaId) {
			solicitudGuiaLocalService.add(solicitud.getId(), guiaId);
		}
		
		return solicitud;

	}

	public Solicitud update(long solicitudId, long contactoId, long cantidadParticipantes, long cantidadCoordinadores,
			long cantidadMicros, long discapacidad, long cantidadPersonasDiscapacidad,
			String microGratis, String observaciones, long itinerarioId, Date fechaItinerario,
			List<Long> listGuiaId) throws SystemException, PortalException {

		Date hoy = new Date();
		
		Solicitud solicitud = this.getSolicitud(solicitudId);

		solicitud.setContactoId(contactoId);
		solicitud.setCantidadParticipantes(cantidadParticipantes);
		solicitud.setCantidadCoordinadores(cantidadCoordinadores);
		solicitud.setCantidadMicros(cantidadMicros);
		solicitud.setDiscapacidad(discapacidad);
		solicitud.setCantidadPersonasDiscapacidad(cantidadPersonasDiscapacidad);
		solicitud.setMicroGratis(microGratis);
		solicitud.setObservaciones(observaciones);
		if (solicitud.getItinerarioId() != itinerarioId ||
				!solicitud.getFechaItinerario().equals(fechaItinerario)) {
			solicitud.setItinerarioPrevio(solicitud.getItinerarioId());
			solicitud.setFechaPreviaItinerario(solicitud.getFechaItinerario());
			solicitud.setItinerarioId(itinerarioId);
			solicitud.setFechaItinerario(fechaItinerario);
			solicitud.setFechaAsignacionItinerario(hoy);
		}

		solicitud = super.updateSolicitud(solicitud);

		solicitudGuiaLocalService.removeBySolicitudId(solicitudId);

		for (Long guiaId : listGuiaId) {
			solicitudGuiaLocalService.add(solicitud.getId(), guiaId);
		}
		
		return solicitud;

	}

	private DynamicQuery createDynamicQueryFromMap(Map<String, String> map, boolean count) {

		DynamicQuery query = DynamicQueryFactoryUtil.forClass(Solicitud.class);

		Calendar today = GregorianCalendar.getInstance();
		today.set(Calendar.HOUR_OF_DAY, 0);
		today.set(Calendar.MINUTE, 0);
		today.set(Calendar.SECOND, 0);
		today.set(Calendar.MILLISECOND, 0);

		/*if ("0".equals(map.get("modoListado"))) {
			query.add(PropertyFactoryUtil.forName("fechaAsignacionItinerario")
					.isNull());
		}
		else */if ("1".equals(map.get("modoListado"))) {
			/*query.add(PropertyFactoryUtil.forName("fechaAsignacionItinerario")
					.isNotNull());*/
			query.add(PropertyFactoryUtil.forName("fechaConfirmacionItinerario")
					.isNull());
		}
		else if ("2".equals(map.get("modoListado"))) {
			query.add(PropertyFactoryUtil.forName("fechaConfirmacionItinerario")
					.isNotNull());
			query.add(PropertyFactoryUtil.forName("fechaItinerario")
					.ge(today.getTime()));
		}
		else if ("3".equals(map.get("modoListado"))) {
			query.add(PropertyFactoryUtil.forName("fechaConfirmacionItinerario")
					.isNotNull());
			query.add(PropertyFactoryUtil.forName("fechaItinerario")
					.lt(today.getTime()));
		}

		query.add(PropertyFactoryUtil.forName("fechaBaja").isNull());

		if (!count && map.get("orderBy") != null && !map.get("orderBy").trim().equals("")) {
			if (map.get("orderType") != null && map.get("orderType").trim().equals("desc"))
				query.addOrder(OrderFactoryUtil.desc(map.get("orderBy")));
			else
				query.addOrder(OrderFactoryUtil.asc(map.get("orderBy")));
        }

		return query;

	}

	public List<Solicitud> findByMap(Map<String, String> map) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, false);

		return solicitudPersistence.findWithDynamicQuery(query);

	}

	public List<Solicitud> findByMap(Map<String, String> map, int start, int end) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, false);

		return solicitudPersistence.findWithDynamicQuery(query, start, end);

	}

	public long countByMap(Map<String, String> map) throws SystemException {

		DynamicQuery query = createDynamicQueryFromMap(map, true);

		return solicitudPersistence.countWithDynamicQuery(query);

	}

	public List<Solicitud> findByContactoId(long contactoId) throws SystemException {
		return this.solicitudPersistence.findByContactoId(contactoId);
	}

	public List<Solicitud> findByFechaItinerarioAndFechaBaja(Date fechaItinerario, Date fechaBaja) throws SystemException {
		Calendar calendar = GregorianCalendar.getInstance();
		calendar.setTime(fechaItinerario);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		
		Date fecha = calendar.getTime();

		calendar.add(Calendar.DATE, 1);
		
		Date fecha1 = calendar.getTime();

		
		DynamicQuery query = DynamicQueryFactoryUtil.forClass(Solicitud.class);

		query.add(PropertyFactoryUtil.forName("fechaItinerario")
				.ge(fecha));

		query.add(PropertyFactoryUtil.forName("fechaItinerario")
				.lt(fecha1));
		
		query.add(PropertyFactoryUtil.forName("fechaBaja")
				.isNull());

		return solicitudPersistence.findWithDynamicQuery(query);
	}

	public List<Solicitud> findByItinerarioIdAndFechaItinerarioAndFechaBaja(long itinerarioId, Date fechaItinerario, Date fechaBaja) throws SystemException {
		return this.solicitudPersistence.findByItinerarioIdAndFechaItinerarioAndFechaBaja(itinerarioId, fechaItinerario, fechaBaja);
	}

	public List<Solicitud> findByFechaItinerarioDesdeAndFechaItinerarioHasta(Date fechaItinerarioDesde, Date fechaItinerarioHasta)
			throws SystemException {

		return findByItinerarioIdAndFechaItinerarioDesdeAndFechaItinerarioHasta(null, fechaItinerarioDesde, fechaItinerarioHasta);

	}

	public List<Solicitud> findByItinerarioIdAndFechaItinerarioDesdeAndFechaItinerarioHasta(Long itinerarioId, Date fechaItinerarioDesde, Date fechaItinerarioHasta)
			throws SystemException {

		DynamicQuery query = DynamicQueryFactoryUtil.forClass(Solicitud.class);

		if (itinerarioId != null)
			query.add(PropertyFactoryUtil.forName("itinerarioId")
					.eq(itinerarioId));

		query.add(PropertyFactoryUtil.forName("fechaItinerario")
				.gt(fechaItinerarioDesde));

		query.add(PropertyFactoryUtil.forName("fechaItinerario")
				.lt(fechaItinerarioHasta));
		
		query.add(PropertyFactoryUtil.forName("fechaBaja").isNull());

		
		return this.solicitudPersistence.findWithDynamicQuery(query);

	}

}
